package utils

import (
	"crypto/md5"
	"encoding/hex"
	"strconv"
	"unsafe"
)

// MD5ID
// md5+id 包裹参数
// 支持从接口参数中提取md5+id值转为数据库ID
// 支持接口返回结果把数据库ID格式化为md5+id
type MD5ID string

// ID 获取数据库实际id
func (m MD5ID) ID() int {
	return FormatMD5ID(string(m))
}

type TypeNumber interface {
	int | uint | int8 | uint8 | int16 | uint16 | int32 | uint32 | int64 | uint64
}

// NewMD5ID 根据id初始化md5+id,多用于接口返回单个id字段
func NewMD5ID[T TypeNumber](id T) string {
	if id == 0 {
		return ""
	}
	idStr := strconv.FormatInt(int64(id), 10)
	hash := md5.Sum(StringToBytes(idStr))
	md5id := hex.EncodeToString(hash[:])
	return md5id + idStr
}

func FormatMD5ID(id string) int {
	if id == "" {
		return 0
	}
	if len(id) > 32 {
		id = id[32:]
	}
	value, _ := strconv.Atoi(id)
	return value
}

func StringToBytes(str string) []byte {
	return *(*[]byte)(unsafe.Pointer(&struct {
		string
		Cap int
	}{str, len(str)}))
}
